#导入相应模块
import pygame
from pygame.locals import *
import time,random

class HeroPlane():
	'''玩家飞机'''
	def __init__(self,screen_temp):
		self.x = 200
		self.y = 400
		self.screen = screen_temp
		self.image = pygame.image.load("./images/me.png")
		self.bullet_list = []#玩家子弹列表

	def display(self):
		'''绘制玩家飞机'''
		
		#绘制子弹
		for bullet in self.bullet_list:
			bullet.display()
			#炮弹移动，如果满足条件，就移除对象
			if bullet.move():
				self.bullet_list.remove(bullet)

		self.screen.blit(self.image,(self.x,self.y))

	def move_left(self):
		'''左移玩家飞机'''
		self.x -= 5
		if self.x <= 0:
			self.x = 0

	def move_right(self):
		'''右移玩家飞机'''
		self.x += 5
		if self.x >= 406:
			self.x = 406

	def move_up(self):
		'''上移玩家飞机'''
		self.y -= 8
		if self.y <= 0:
			self.y = 0

	def move_down(self):
		'''下移玩家飞机'''
		self.y += 8
		if self.y >= 492:
			self.y = 492

	def fire(self):
		self.bullet_list.append(Bullet(self.screen,self.x,self.y))
		#屏幕上的子弹数
		#print(len(self.bullet_list))

class Bullet:
	'''子弹类'''
	def __init__(self,screen_temp,x,y):
		self.x = x+53
		self.y = y
		self.screen = screen_temp
		self.image = pygame.image.load("./images/pd.png")

	def display(self):
		'''绘制子弹'''
		self.screen.blit(self.image,(self.x,self.y))

	def move(self):
		self.y -= 10
		if self.y <= -20:
			return True

class EnemyPlane:
	'''敌机类'''
	def __init__(self,screen_temp):
		self.x = random.choice(range(408))
		self.y = -75
		self.screen = screen_temp
		self.image = pygame.image.load("./images/e"+str(random.choice(range(3)))+".png")
		self.bullet_list2 = []
	def display(self):
		'''绘制敌机'''
        #绘制子弹
		for bullet2 in self.bullet_list2:
			bullet2.display()
			#炮弹移动，如果满足条件，就移除对象
			if bullet.move():
				self.bullet_list2.remove(bullet)
		self.screen.blit(self.image,(self.x,self.y))

	def move(self,hero):
		self.y += 4
		if self.y > 568 :
			return True
		#遍历所有子弹，并执行碰撞检测
		for bo in hero.bullet_list:
			if bo.x > self.x+12 and bo.x < self.x+92 and bo.y >self.y+20 and bo.y <self.y+60:
				hero.bullet_list.remove(bo)
				return True
	def fire(self):
		self.bullet_list.append(Bullet(self.screen,self.x,self.y))

class Bomb:
	'''爆炸'''
	def __init__(self,screen_temp,x,y):
		self.x = x+40
		self.y = y
		self.i = 0
		self.screen = screen_temp
		self.image = None

	def display(self):
		'''绘制爆炸效果'''
		self.image = pygame.image.load("./images/bomb.png")
		self.screen.blit(self.image, (self.x, self.y))
		self.i += 1

def key_control(hero_temp):
	'''键盘控制函数'''

	#执行程序退出操作
	for event in pygame.event.get():
		#判断退出
		if event.type == QUIT:
			print("exit()")
			exit()

	#获取按键信息
	pressed_keys = pygame.key.get_pressed()
	#print(pressed_keys)

	#做判断，并执行对象的操作
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:
		#print("left...")
		hero_temp.move_left()
	elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		#print("right...")
		hero_temp.move_right()
	if pressed_keys[K_UP] or pressed_keys[K_w]:
		#print("up...")
		hero_temp.move_up()
	elif pressed_keys[K_DOWN] or pressed_keys[K_s]:
		#print("down...")
		hero_temp.move_down()
	
	if pressed_keys[K_SPACE]:
		#print("space...")
		hero_temp.fire()

def main():
	'''游戏主程序执行函数'''
	#创建游戏窗口
	screen = pygame.display.set_mode((512,568),0,0)

	#创建一个游戏背景
	background = pygame.image.load("./images/bg2.jpg")
	
	#创建玩家飞机
	hero = HeroPlane(screen)

	m = -968
	enemylist = [] #存放敌机的列表
	bomblist = [] #爆炸列表
	#保证程序不会关闭
	while True:
		#绘制画面
		screen.blit(background,(0,m))

		#动态背景
		m+=2
		if m>=-200:
			m = -968

		#绘制玩家飞机
		hero.display()

		#调用键盘控制函数
		key_control(hero)

		#随机绘制敌机
		if random.choice(range(50)) == 10:
			enemylist.append(EnemyPlane(screen))
		#遍历绘制并移动敌机
		for em in enemylist:
			em.display()
			if em.move(hero):
				#爆炸效果
				bomblist.append(Bomb(screen,em.x,em.y))
				enemylist.remove(em)

		#遍历爆炸列表
		for bomb in bomblist:
			bomb.display()
			if bomb.i > 4:
				bomblist.remove(bomb)

		#更新显示
		pygame.display.update()

		#定时睡眠
		time.sleep(0.04)

#判断当前是否是主运行程序，并调用
if __name__ == "__main__":
	main()